﻿using System;
using System.Collections.Generic;
using System.Text;
using System.IO;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Drawing.Imaging;

namespace Rmlife.Common
{
    public class PTImage
    {
        #region 正方型裁剪并缩放
        ///<summary>       
        /// 正方型裁剪      
        /// 以图片中心为轴心，截取正方型，然后等比缩放      
        /// 用于头像处理         /// </summary>        
        /// <remarks>吴剑 2010-11-23</remarks>      
        /// <param name="postedFile">原图HttpPostedFile对象</param>  
        /// <param name="fileSaveUrl">缩略图存放地址</param>      
        /// <param name="side">指定的边长（正方型）</param>     
        /// <param name="quality">质量（范围0-100）</param>       
        public static void CutForSquare(System.Web.HttpPostedFile postedFile, string fileSaveUrl, int side, int quality)
        {
            //创建目录           
            string dir = Path.GetDirectoryName(fileSaveUrl);
            if (!Directory.Exists(dir))

                Directory.CreateDirectory(dir);
            //原始图片（获取原始图片创建对象，并使用流中嵌入的颜色管理信息）    
            System.Drawing.Image initImage = System.Drawing.Image.FromStream(postedFile.InputStream, true);
            //原图宽高均小于模版，不作处理，直接保存       
            if (initImage.Width <= side && initImage.Height <= side)
            {
                initImage.Save(fileSaveUrl, System.Drawing.Imaging.ImageFormat.Jpeg);
            }
            else
            {
                //原始图片的宽、高    
                int initWidth = initImage.Width;
                int initHeight = initImage.Height;

                //非正方型先裁剪为正方型              
                if (initWidth != initHeight)
                {
                    #region "非正方形"
                    //截图对象              
                    System.Drawing.Image pickedImage = null;
                    System.Drawing.Graphics pickedG = null;
                    //宽大于高的横图               
                    if (initWidth > initHeight)
                    {
                        //对象实例化          
                        pickedImage = new System.Drawing.Bitmap(initHeight, initHeight);
                        pickedG = System.Drawing.Graphics.FromImage(pickedImage);
                        //设置质量                    
                        pickedG.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic; pickedG.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
                        //定位   
                        Rectangle fromR = new Rectangle((initWidth - initHeight) / 2, 0, initHeight, initHeight);
                        Rectangle toR = new Rectangle(0, 0, initHeight, initHeight); //目标文件


                        //画图                     
                        pickedG.DrawImage(initImage, toR, fromR, System.Drawing.GraphicsUnit.Pixel);
                        //重置宽               
                        initWidth = side;
                    }
                    //高大于宽的竖图             
                    else
                    {
                        //对象实例化          
                        pickedImage = new System.Drawing.Bitmap(initWidth, initWidth);
                        pickedG = System.Drawing.Graphics.FromImage(pickedImage);
                        //设置质量                
                        pickedG.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic; pickedG.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
                        //定位                 
                        Rectangle fromR = new Rectangle(0, (initHeight - initWidth) / 2, initWidth, initWidth);
                        Rectangle toR = new Rectangle(0, 0, initWidth, initWidth);

                        //画图                    
                        pickedG.DrawImage(initImage, toR, fromR, System.Drawing.GraphicsUnit.Pixel);
                        //重置高                    
                        initHeight = initWidth;
                    }
                    //将截图对象赋给原图            
                    initImage = (System.Drawing.Image)pickedImage.Clone();
                    //释放截图资源                   
                    pickedG.Dispose();
                    pickedImage.Dispose();
                    #endregion
                }

                //缩略图对象    
                System.Drawing.Image resultImage = new System.Drawing.Bitmap(side, side);
                System.Drawing.Graphics resultG = System.Drawing.Graphics.FromImage(resultImage);
                //设置质量              
                resultG.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
                resultG.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
                //用指定背景色清空画布                
                resultG.Clear(Color.White);
                //绘制缩略图             
                resultG.DrawImage(initImage, new System.Drawing.Rectangle(0, 0, side, side), new System.Drawing.Rectangle(0, 0, initWidth, initHeight), System.Drawing.GraphicsUnit.Pixel);
                //关键质量控制      
                //获取系统编码类型数组,包含了jpeg,bmp,png,gif,tiff      
                ImageCodecInfo[] icis = ImageCodecInfo.GetImageEncoders();
                ImageCodecInfo ici = null;
                foreach (ImageCodecInfo i in icis)
                {
                    if (i.MimeType == "image/jpeg" || i.MimeType == "image/bmp" || i.MimeType == "image/png" || i.MimeType == "image/gif")
                    {
                        ici = i;
                    }
                }
                EncoderParameters ep = new EncoderParameters(1);
                ep.Param[0] = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, (long)quality);
                //保存缩略图              
                resultImage.Save(fileSaveUrl, ici, ep);
                //释放关键质量控制所用资源              
                ep.Dispose();
                //释放缩略图资源          
                resultG.Dispose();
                resultImage.Dispose();
                //释放原始图片资源              
                initImage.Dispose();
            }
        }

        ///<summary>       
        /// 正方型裁剪 ：通用重载      
        /// 以图片中心为轴心，截取正方型，然后等比缩放      
        /// 用于头像处理         /// </summary>        
        /// <remarks>吴剑 2010-11-23</remarks>      
        /// <param name="postedFile">原图HttpPostedFile对象</param>  
        /// <param name="fileSaveUrl">缩略图存放地址</param>      
        /// <param name="side">指定的边长（正方型）</param>     
        /// <param name="quality">质量（范围0-100）</param>       
        public static string CutForSquare(System.Web.HttpPostedFile postedFile, string fileSaveUrl, string filename, int pointX, int pointY, int side, int quality)
        {
            string result = string.Empty;
            string lImgSrc = string.Empty;
            string sImgSrc = string.Empty;

            //创建目录           
            string dir = Path.GetDirectoryName(fileSaveUrl);
            if (string.IsNullOrEmpty(filename))
            {
                filename = Guid.NewGuid().ToString();
            }
            filename += System.IO.Path.GetExtension(postedFile.FileName);
            if (!Directory.Exists(dir))
                Directory.CreateDirectory(dir);
            //原始图片（获取原始图片创建对象，并使用流中嵌入的颜色管理信息）    
            System.Drawing.Image initImage = System.Drawing.Image.FromStream(postedFile.InputStream, true);
            //原图宽高均小于模版，不作处理，直接保存       
            if (initImage.Width <= side && initImage.Height <= side)
            {
                initImage.Save(fileSaveUrl, System.Drawing.Imaging.ImageFormat.Jpeg);
            }
            else
            {
                //原始图片的宽、高    
                int initWidth = initImage.Width;
                int initHeight = initImage.Height;

                #region "过时"
                /* *
                //非正方型先裁剪为正方型              
                if (initWidth != initHeight)
                {
                    #region "非正方形"
                    //截图对象              
                    System.Drawing.Image pickedImage = null;
                    System.Drawing.Graphics pickedG = null;
                    //宽大于高的横图               
                    if (initWidth > initHeight)
                    {
                        //对象实例化          
                        pickedImage = new System.Drawing.Bitmap(initHeight, initHeight);
                        pickedG = System.Drawing.Graphics.FromImage(pickedImage);
                        //设置质量                    
                        pickedG.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic; pickedG.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
                        //定位   
                        Rectangle fromR = new Rectangle((initWidth - initHeight) / 2, 0, initHeight, initHeight);
                        Rectangle toR = new Rectangle(0, 0, initHeight, initHeight); //目标文件


                        //画图                     
                        pickedG.DrawImage(initImage, toR, fromR, System.Drawing.GraphicsUnit.Pixel);
                        //重置宽               
                        initWidth = side;
                    }
                    //高大于宽的竖图             
                    else
                    {
                        //对象实例化          
                        pickedImage = new System.Drawing.Bitmap(initWidth, initWidth);
                        pickedG = System.Drawing.Graphics.FromImage(pickedImage);
                        //设置质量                
                        pickedG.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic; pickedG.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
                        //定位                 
                        Rectangle fromR = new Rectangle(0, (initHeight - initWidth) / 2, initWidth, initWidth);
                        Rectangle toR = new Rectangle(0, 0, initWidth, initWidth);

                        //画图                    
                        pickedG.DrawImage(initImage, toR, fromR, System.Drawing.GraphicsUnit.Pixel);
                        //重置高                    
                        initHeight = initWidth;
                    }
                    //将截图对象赋给原图            
                    initImage = (System.Drawing.Image)pickedImage.Clone();
                    //释放截图资源                   
                    pickedG.Dispose();
                    pickedImage.Dispose();
                    #endregion
                }
                 * */
                #endregion

                //缩略图对象    
                System.Drawing.Image resultImage = new System.Drawing.Bitmap(side, side);
                System.Drawing.Graphics resultG = System.Drawing.Graphics.FromImage(resultImage);
                //设置质量              
                resultG.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
                resultG.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
                //用指定背景色清空画布                
                resultG.Clear(Color.White);
                //绘制缩略图             
                resultG.DrawImage(initImage, new System.Drawing.Rectangle(pointX, pointY, side, side), new System.Drawing.Rectangle(0, 0, initWidth, initHeight), System.Drawing.GraphicsUnit.Pixel);
                //关键质量控制      
                //获取系统编码类型数组,包含了jpeg,bmp,png,gif,tiff      
                ImageCodecInfo[] icis = ImageCodecInfo.GetImageEncoders();
                ImageCodecInfo ici = null;
                foreach (ImageCodecInfo i in icis)
                {
                    if (i.MimeType == "image/jpeg" || i.MimeType == "image/bmp" || i.MimeType == "image/png" || i.MimeType == "image/gif")
                    {
                        ici = i;
                    }
                }
                EncoderParameters ep = new EncoderParameters(1);
                ep.Param[0] = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, (long)quality);

                if (!string.IsNullOrEmpty(dir))
                {
                    //大图
                    lImgSrc = Utils.PathCombine(dir, filename);
                    //保存缩略图      
                    if (File.Exists(lImgSrc))
                        File.Delete(lImgSrc);
                    resultImage.Save(lImgSrc, ici, ep);
                    result = lImgSrc;
                }

                //释放关键质量控制所用资源              
                ep.Dispose();
                //释放缩略图资源          
                resultG.Dispose();
                resultImage.Dispose();
                //释放原始图片资源              
                initImage.Dispose();
                return result;
            }
            return null;
        }

        /// <summary>        
        /// 正方型裁剪     
        /// 以图片中心为轴心，截取正方型，然后等比缩放
        /// 用于头像处理      
        /// </summary>      
        /// <remarks>吴剑 2010-11-23</remarks>  
        /// <param name="postedFile">原图HttpPostedFile对象</param>    
        /// <param name="fileSaveUrl">缩略图存放地址</param>     
        /// <param name="side">指定的边长（正方型）</param>     
        /// <param name="quality">质量（范围0-100）</param>    
        public static void CutForSquare(System.IO.Stream fromFile, string fileSaveUrl, int side, int quality)
        {
            //创建目录          
            string dir = Path.GetDirectoryName(fileSaveUrl);
            if (!Directory.Exists(dir))
                Directory.CreateDirectory(dir);
            //原始图片（获取原始图片创建对象，并使用流中嵌入的颜色管理信息）         
            System.Drawing.Image initImage = System.Drawing.Image.FromStream(fromFile, true);
            //原图宽高均小于模版，不作处理，直接保存          
            if (initImage.Width <= side && initImage.Height <= side)
            {
                initImage.Save(fileSaveUrl, System.Drawing.Imaging.ImageFormat.Jpeg);
            }
            else
            {
                //原始图片的宽、高    
                int initWidth = initImage.Width;
                int initHeight = initImage.Height;
                //非正方型先裁剪为正方型          
                if (initWidth != initHeight)
                {
                    //截图对象           
                    System.Drawing.Image pickedImage = null;
                    System.Drawing.Graphics pickedG = null;
                    //宽大于高的横图             
                    if (initWidth > initHeight)
                    {
                        //对象实例化          
                        pickedImage = new System.Drawing.Bitmap(initHeight, initHeight);
                        pickedG = System.Drawing.Graphics.FromImage(pickedImage);
                        //设置质量                    
                        pickedG.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic; pickedG.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
                        //定位               
                        Rectangle fromR = new Rectangle((initWidth - initHeight) / 2, 0, initHeight, initHeight); Rectangle toR = new Rectangle(0, 0, initHeight, initHeight);
                        //画图              
                        pickedG.DrawImage(initImage, toR, fromR, System.Drawing.GraphicsUnit.Pixel);
                        //重置宽                   
                        initWidth = initHeight;
                    }
                    //高大于宽的竖图              
                    else
                    {
                        //对象实例化                    
                        pickedImage = new System.Drawing.Bitmap(initWidth, initWidth);
                        pickedG = System.Drawing.Graphics.FromImage(pickedImage);
                        //设置质量                   
                        pickedG.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic; pickedG.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
                        //定位                
                        Rectangle fromR = new Rectangle(0, (initHeight - initWidth) / 2, initWidth, initWidth); Rectangle toR = new Rectangle(0, 0, initWidth, initWidth);
                        //画图                   
                        pickedG.DrawImage(initImage, toR, fromR, System.Drawing.GraphicsUnit.Pixel);
                        //重置高                    
                        initHeight = initWidth;
                    }
                    //将截图对象赋给原图            
                    initImage = (System.Drawing.Image)pickedImage.Clone();
                    //释放截图资源                  
                    pickedG.Dispose();
                    pickedImage.Dispose();
                }
                //缩略图对象           
                System.Drawing.Image resultImage = new System.Drawing.Bitmap(side, side);
                System.Drawing.Graphics resultG = System.Drawing.Graphics.FromImage(resultImage);
                //设置质量               
                resultG.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
                resultG.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
                //用指定背景色清空画布                
                resultG.Clear(Color.White);
                //绘制缩略图              
                resultG.DrawImage(initImage, new System.Drawing.Rectangle(0, 0, side, side), new System.Drawing.Rectangle(0, 0, initWidth, initHeight), System.Drawing.GraphicsUnit.Pixel);
                //关键质量控制               
                //获取系统编码类型数组,包含了jpeg,bmp,png,gif,tiff      
                ImageCodecInfo[] icis = ImageCodecInfo.GetImageEncoders();
                ImageCodecInfo ici = null;
                foreach (ImageCodecInfo i in icis)
                {
                    if (i.MimeType == "image/jpeg" || i.MimeType == "image/bmp" || i.MimeType == "image/png" || i.MimeType == "image/gif")
                    {
                        ici = i;
                    }
                }
                EncoderParameters ep = new EncoderParameters(1);
                ep.Param[0] = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, (long)quality);
                //保存缩略图             
                resultImage.Save(fileSaveUrl, ici, ep);
                //释放关键质量控制所用资源             
                ep.Dispose();
                //释放缩略图资源              
                resultG.Dispose();
                resultImage.Dispose();
                //释放原始图片资源               
                initImage.Dispose();
            }
        }

        /// <summary>        
        /// 正方型裁剪:重载  
        /// 以图片中心为轴心，截取正方型，然后等比缩放
        /// 用于头像处理      
        /// </summary>      
        /// <remarks>吴剑 2010-11-23</remarks>  
        /// <param name="postedFile">原图HttpPostedFile对象</param>    
        /// <param name="fileSaveUrl">缩略图存放地址</param>     
        /// <param name="side">指定的边长（正方型）</param>     
        /// <param name="quality">质量（范围0-100）</param>    
        public static string CutForSquare(System.IO.Stream fromFile, string fileSaveUrl, int pointX, int pointY, int side, int quality)
        {
            string result = string.Empty;
            string lImgSrc = string.Empty;
            string sImgSrc = string.Empty;
            //创建目录
            string dir = Path.GetDirectoryName(fileSaveUrl);
            if (!Directory.Exists(dir))
                Directory.CreateDirectory(dir);
            //原始图片（获取原始图片创建对象，并使用流中嵌入的颜色管理信息）         
            System.Drawing.Image initImage = System.Drawing.Image.FromStream(fromFile, true);
            //原图宽高均小于模版，不作处理，直接保存          
            if (initImage.Width <= side && initImage.Height <= side)
            {
                //initImage.Save(fileSaveUrl, System.Drawing.Imaging.ImageFormat.Jpeg);
                return fileSaveUrl;
            }
            else
            {
                //缩略图对象           
                System.Drawing.Image resultImage = new System.Drawing.Bitmap(side, side);
                System.Drawing.Graphics resultG = System.Drawing.Graphics.FromImage(resultImage);
                //设置质量               
                resultG.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
                resultG.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
                //用指定背景色清空画布                
                resultG.Clear(Color.White);
                //绘制缩略图              
                //  resultG.DrawImage(initImage, new System.Drawing.Rectangle((180 - side) / 2, (180 - side) / 2,side, side), new System.Drawing.Rectangle(pointX, pointY, pointX + side, pointY + side), System.Drawing.GraphicsUnit.Pixel);
                resultG.DrawImage(initImage, new System.Drawing.Rectangle(0, 0, pointX + side, pointY + side), new System.Drawing.Rectangle(pointX, pointY, pointX + side, pointY + side), System.Drawing.GraphicsUnit.Pixel);
                //关键质量控制               
                //获取系统编码类型数组,包含了jpeg,bmp,png,gif,tiff      
                ImageCodecInfo[] icis = ImageCodecInfo.GetImageEncoders();
                ImageCodecInfo ici = null;
                foreach (ImageCodecInfo i in icis)
                {
                    if (i.MimeType == "image/jpeg" || i.MimeType == "image/bmp" || i.MimeType == "image/png" || i.MimeType == "image/gif")
                    {
                        ici = i;
                    }
                }
                EncoderParameters ep = new EncoderParameters(1);
                ep.Param[0] = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, (long)quality);
                if (!string.IsNullOrEmpty(dir))
                {
                    string tName = Guid.NewGuid().ToString() + ".jpg";
                    //如果图片格式不正确则返回空字符串，否则返回Http相对路径
                    if (initImage.RawFormat.Guid == System.Drawing.Imaging.ImageFormat.Jpeg.Guid)
                    {
                        tName = Guid.NewGuid().ToString() + ".jpg";
                    }
                    else if (initImage.RawFormat.Guid == System.Drawing.Imaging.ImageFormat.Png.Guid)
                    {
                        tName = Guid.NewGuid().ToString() + ".png";
                    }
                    else if (initImage.RawFormat.Guid == System.Drawing.Imaging.ImageFormat.Gif.Guid)
                    {
                        tName = Guid.NewGuid().ToString() + ".gif";
                    }

                    //大图
                    lImgSrc = Utils.PathCombine(dir, tName);

                    resultImage.Save(lImgSrc);
                    result = lImgSrc;
                }
                //释放关键质量控制所用资源             
                ep.Dispose();
                //释放缩略图资源              
                resultG.Dispose();
                resultImage.Dispose();
                //释放原始图片资源               
                initImage.Dispose();
                return result;
            }
        }

        #endregion

        #region 固定模版裁剪并缩放
        /// <summary>         
        /// 指定长宽裁剪         
        /// 按模版比例最大范围的裁剪图片并缩放至模版尺寸        
        /// </summary>         
        /// <remarks>吴剑 2010-11-15</remarks>         
        /// <param name="postedFile">原图HttpPostedFile对象</param>         
        /// <param name="fileSaveUrl">保存路径</param>         
        /// <param name="maxWidth">最大宽(单位:px)</param>         
        /// <param name="maxHeight">最大高(单位:px)</param>         
        /// <param name="quality">质量（范围0-100）</param>         
        public static void CutForCustom(System.Web.HttpPostedFile postedFile, string fileSaveUrl, int maxWidth, int maxHeight, int quality)
        {
            //从文件获取原始图片，并使用流中嵌入的颜色管理信息             
            System.Drawing.Image initImage = System.Drawing.Image.FromStream(postedFile.InputStream, true);
            //原图宽高均小于模版，不作处理，直接保存       
            if (initImage.Width <= maxWidth && initImage.Height <= maxHeight)
            {
                initImage.Save(fileSaveUrl, System.Drawing.Imaging.ImageFormat.Jpeg);
            }
            else
            {
                //模版的宽高比例           
                double templateRate = (double)maxWidth / maxHeight;
                //原图片的宽高比例            
                double initRate = (double)initImage.Width / initImage.Height;
                //原图与模版比例相等，直接缩放              
                if (templateRate == initRate)
                {
                    //按模版大小生成最终图片             
                    System.Drawing.Image templateImage = new System.Drawing.Bitmap(maxWidth, maxHeight);
                    System.Drawing.Graphics templateG = System.Drawing.Graphics.FromImage(templateImage);
                    templateG.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.High;
                    templateG.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
                    templateG.Clear(Color.White);
                    templateG.DrawImage(initImage, new System.Drawing.Rectangle(0, 0, maxWidth, maxHeight), new System.Drawing.Rectangle(0, 0, initImage.Width, initImage.Height), System.Drawing.GraphicsUnit.Pixel);
                    templateImage.Save(fileSaveUrl, System.Drawing.Imaging.ImageFormat.Jpeg);
                }
                //原图与模版比例不等，裁剪后缩放        
                else
                {
                    //裁剪对象              
                    System.Drawing.Image pickedImage = null;
                    System.Drawing.Graphics pickedG = null;
                    //定位               
                    Rectangle fromR = new Rectangle(0, 0, 0, 0);//原图裁剪定位         
                    Rectangle toR = new Rectangle(0, 0, 0, 0);//目标定位      
                    //宽为标准进行裁剪              
                    if (templateRate > initRate)
                    {
                        //裁剪对象实例化            
                        pickedImage = new System.Drawing.Bitmap(initImage.Width, (int)Math.Floor(initImage.Width / templateRate)); pickedG = System.Drawing.Graphics.FromImage(pickedImage);
                        //裁剪源定位                        
                        fromR.X = 0;
                        fromR.Y = (int)Math.Floor((initImage.Height - initImage.Width / templateRate) / 2);
                        fromR.Width = initImage.Width;
                        fromR.Height = (int)Math.Floor(initImage.Width / templateRate);
                        //裁剪目标定位                       
                        toR.X = 0;
                        toR.Y = 0;
                        toR.Width = initImage.Width;
                        toR.Height = (int)Math.Floor(initImage.Width / templateRate);
                    }
                    //高为标准进行裁剪          
                    else
                    {
                        pickedImage = new System.Drawing.Bitmap((int)Math.Floor(initImage.Height * templateRate), initImage.Height); pickedG = System.Drawing.Graphics.FromImage(pickedImage);
                        fromR.X = (int)Math.Floor((initImage.Width - initImage.Height * templateRate) / 2);
                        fromR.Y = 0;
                        fromR.Width = (int)Math.Floor(initImage.Height * templateRate);
                        fromR.Height = initImage.Height;
                        toR.X = 0;
                        toR.Y = 0;
                        toR.Width = (int)Math.Floor(initImage.Height * templateRate);
                        toR.Height = initImage.Height;
                    }
                    //设置质量           
                    pickedG.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic; pickedG.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
                    //裁剪              
                    pickedG.DrawImage(initImage, toR, fromR, System.Drawing.GraphicsUnit.Pixel);
                    //按模版大小生成最终图片                   
                    System.Drawing.Image templateImage = new System.Drawing.Bitmap(maxWidth, maxHeight);
                    System.Drawing.Graphics templateG = System.Drawing.Graphics.FromImage(templateImage);
                    templateG.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.High;
                    templateG.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
                    templateG.Clear(Color.White);
                    templateG.DrawImage(pickedImage, new System.Drawing.Rectangle(0, 0, maxWidth, maxHeight), new System.Drawing.Rectangle(0, 0, pickedImage.Width, pickedImage.Height), System.Drawing.GraphicsUnit.Pixel);
                    //关键质量控制                    
                    //获取系统编码类型数组,包含了jpeg,bmp,png,gif,tiff          
                    ImageCodecInfo[] icis = ImageCodecInfo.GetImageEncoders();
                    ImageCodecInfo ici = null;
                    foreach (ImageCodecInfo i in icis)
                    {
                        if (i.MimeType == "image/jpeg" || i.MimeType == "image/bmp" || i.MimeType == "image/png" || i.MimeType == "image/gif")
                        {
                            ici = i;
                        }
                    }
                    EncoderParameters ep = new EncoderParameters(1);
                    ep.Param[0] = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, (long)quality);
                    //保存缩略图                
                    templateImage.Save(fileSaveUrl, ici, ep);
                    //templateImage.Save(fileSaveUrl, System.Drawing.Imaging.ImageFormat.Jpeg);         
                    //释放资源                   
                    templateG.Dispose();
                    templateImage.Dispose();
                    pickedG.Dispose();
                    pickedImage.Dispose();
                }
            }
            //释放资源           
            initImage.Dispose();
        }
        #endregion
        #region 等比缩放
        /// <summary>
        /// 
        /// </summary>
        /// <param name="postedFile"></param>
        /// <param name="savePath"></param>
        /// <param name="targetHeight"></param>
        public static string ZoomAuto220(System.IO.Stream fromFile, string savePath, System.Double targetWidth, System.Double targetHeight, string watermarkText, string watermarkImage, int quality)
        {
            string result = string.Empty;
            //创建目录       
            string dir = Path.GetDirectoryName(savePath);
            if (!Directory.Exists(dir))
                Directory.CreateDirectory(dir);
            //   savePath = Utils.PathCombine(dir, savePath.Substring(0, savePath.LastIndexOf('\\') + 1) + ".jpg");
            //原始图片（获取原始图片创建对象，并使用流中嵌入的颜色管理信息）  
            System.Drawing.Image initImage = System.Drawing.Image.FromStream(fromFile, true);

            //生成新图              
            //新建一个bmp图片           
            System.Drawing.Image newImage = new System.Drawing.Bitmap((int)targetWidth, (int)targetHeight);
            //System.Drawing.Image newImageO = new System.Drawing.Bitmap(220, 220, PixelFormat.Format32bppArgb);

            //新建一个画板                 
            if (targetHeight < 300)
            {

                System.Drawing.Graphics newG = System.Drawing.Graphics.FromImage(newImage);
                Rectangle rect1 = new Rectangle(0, 0, newImage.Width, newImage.Height);
                //填充背景
                HatchBrush hatchBrush = new HatchBrush(HatchStyle.SmallConfetti, Color.White, Color.White);
                hatchBrush = new HatchBrush(HatchStyle.SmallConfetti, Color.White, Color.White);
                newG.FillRectangle(hatchBrush, rect1);
                //设置质量                 
                newG.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
                newG.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;                   //置背景色     
                newG.Clear(Color.White);                //画图 
                //newG.DrawImage(initImage, new System.Drawing.Rectangle(0, 0, newImage.Width, newImage.Height), new Rectangle(0, 0, initImage.Width, initImage.Height), System.Drawing.GraphicsUnit.Pixel);
                // newG.DrawImageUnscaledAndClipped(initImage, new Rectangle(0, (int)(220-targetHeight)/2, 220, (int)targetHeight));
                newG.DrawImageUnscaledAndClipped(initImage, new Rectangle((int)(targetWidth - initImage.Width) / 2, (int)(120 - targetHeight) / 2, (int)targetWidth, (int)targetHeight));
            }
            else
            {
                System.Drawing.Graphics newG = System.Drawing.Graphics.FromImage(newImage);
                Rectangle rect = new Rectangle(0, 0, newImage.Width, newImage.Height);
                //填充背景
                HatchBrush hatchBrush = new HatchBrush(HatchStyle.SmallConfetti, Color.White, Color.White);
                newG.FillRectangle(hatchBrush, rect);
                //设置质量                 
                newG.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
                newG.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;                   //置背景色     
                newG.Clear(Color.White);                //画图       
                newG.DrawImage(initImage, new System.Drawing.Rectangle(0, 0, newImage.Width, newImage.Height), new System.Drawing.Rectangle(0, 0, initImage.Width, initImage.Height), System.Drawing.GraphicsUnit.Pixel);                   //文字水印     
            }
            if (watermarkText != "")
            {
                using (System.Drawing.Graphics gWater = System.Drawing.Graphics.FromImage(newImage))
                {
                    System.Drawing.Font fontWater = new Font("宋体", 10);
                    System.Drawing.Brush brushWater = new SolidBrush(Color.White);
                    gWater.DrawString(watermarkText, fontWater, brushWater, 10, 10);
                    gWater.Dispose();
                }
            }

            //获取系统编码类型数组,包含了jpeg,bmp,png,gif,tiff      
            ImageCodecInfo[] icis = ImageCodecInfo.GetImageEncoders();
            ImageCodecInfo ici = null;
            foreach (ImageCodecInfo i in icis)
            {
                if (i.MimeType == "image/jpeg" || i.MimeType == "image/bmp" || i.MimeType == "image/png" || i.MimeType == "image/gif")
                {
                    ici = i;
                }
            }
            EncoderParameters ep = new EncoderParameters(1);
            ep.Param[0] = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, (long)quality);

            //保存缩略图        
            try
            {
                //newImage.Save(newPath, ici, ep);
                newImage.Save(savePath);
                result = savePath;
            }
            catch (Exception ex)
            {
                throw ex;
            }
            ep.Dispose();
            //释放资源               
            //  newG.Dispose();
            newImage.Dispose();
            initImage.Dispose();
            return result;
        }

        ///<summary>     
        /// 图片等比缩放         
        ///</summary>         
        /// <remarks>吴剑 2011-01-21</remarks>         
        /// <param name="postedFile">原图HttpPostedFile对象</param>      
        /// <param name="savePath">缩略图存放地址</param>         
        /// <param name="targetWidth">指定的最大宽度</param>         
        /// <param name="targetHeight">指定的最大高度</param>         
        /// <param name="watermarkText">水印文字(为""表示不使用水印)</param>         
        /// <param name="watermarkImage">水印图片路径(为""表示不使用水印)</param>        
        public static void ZoomAuto(System.Web.HttpPostedFile postedFile, string savePath, System.Double targetWidth, System.Double targetHeight, string watermarkText, string watermarkImage)
        {
            //创建目录       
            string dir = Path.GetDirectoryName(savePath);
            if (!Directory.Exists(dir))
                Directory.CreateDirectory(dir);
            //原始图片（获取原始图片创建对象，并使用流中嵌入的颜色管理信息）  
            System.Drawing.Image initImage = System.Drawing.Image.FromStream(postedFile.InputStream, true);
            //原图宽高均小于模版，不作处理，直接保存        
            if (initImage.Width <= targetWidth && initImage.Height <= targetHeight)
            {
                //文字水印          
                if (watermarkText != "")
                {
                    using (System.Drawing.Graphics gWater = System.Drawing.Graphics.FromImage(initImage))
                    {
                        System.Drawing.Font fontWater = new Font("黑体", 10);
                        System.Drawing.Brush brushWater = new SolidBrush(Color.White);
                        gWater.DrawString(watermarkText, fontWater, brushWater, 10, 10);
                        gWater.Dispose();
                    }
                }
                //透明图片水印         
                if (watermarkImage != "")
                {
                    if (File.Exists(watermarkImage))
                    {
                        //获取水印图片             
                        using (System.Drawing.Image wrImage = System.Drawing.Image.FromFile(watermarkImage))
                        {
                            //水印绘制条件：原始图片宽高均大于或等于水印图片      
                            if (initImage.Width >= wrImage.Width && initImage.Height >= wrImage.Height)
                            {
                                Graphics gWater = Graphics.FromImage(initImage);
                                //透明属性        
                                ImageAttributes imgAttributes = new ImageAttributes();
                                ColorMap colorMap = new ColorMap();
                                colorMap.OldColor = Color.FromArgb(255, 0, 255, 0);
                                colorMap.NewColor = Color.FromArgb(0, 0, 0, 0);
                                ColorMap[] remapTable = { colorMap };
                                imgAttributes.SetRemapTable(remapTable, ColorAdjustType.Bitmap);
                                float[][] colorMatrixElements = {                         
                                                                    new float[] {1.0f,  0.0f,  0.0f,  0.0f, 0.0f},            
                                                                    new float[] {0.0f,  1.0f,  0.0f,  0.0f, 0.0f},   
                                                                    new float[] {0.0f,  0.0f,  1.0f,  0.0f, 0.0f},      
                                                                    new float[] {0.0f,  0.0f,  0.0f,  0.5f, 0.0f},//透明度:0.5      
                                                                    new float[] {0.0f,  0.0f,  0.0f,  0.0f, 1.0f}           
                                                                };
                                ColorMatrix wmColorMatrix = new ColorMatrix(colorMatrixElements);
                                imgAttributes.SetColorMatrix(wmColorMatrix, ColorMatrixFlag.Default, ColorAdjustType.Bitmap);
                                gWater.DrawImage(wrImage, new Rectangle(initImage.Width - wrImage.Width, initImage.Height - wrImage.Height, wrImage.Width, wrImage.Height), 0, 0, wrImage.Width, wrImage.Height, GraphicsUnit.Pixel, imgAttributes);
                                gWater.Dispose();
                            }
                            wrImage.Dispose();
                        }
                    }
                }
                //保存                
                initImage.Save(savePath, System.Drawing.Imaging.ImageFormat.Jpeg);
            }
            else
            {
                //缩略图宽、高计算                 
                double newWidth = initImage.Width;
                double newHeight = initImage.Height;
                //宽大于高或宽等于高（横图或正方）               
                if (initImage.Width > initImage.Height || initImage.Width == initImage.Height)
                {
                    //如果宽大于模版                 
                    if (initImage.Width > targetWidth)
                    {
                        //宽按模版，高按比例缩放                    
                        newWidth = targetWidth;
                        newHeight = initImage.Height * (targetWidth / initImage.Width);
                    }
                }                 //高大于宽（竖图）       
                else
                {
                    //如果高大于模版                   
                    if (initImage.Height > targetHeight)
                    {                         //高按模版，宽按比例缩放                    
                        newHeight = targetHeight;
                        newWidth = initImage.Width * (targetHeight / initImage.Height);
                    }
                }
                //生成新图              
                //新建一个bmp图片           
                System.Drawing.Image newImage = new System.Drawing.Bitmap((int)newWidth, (int)newHeight);
                //新建一个画板                 
                System.Drawing.Graphics newG = System.Drawing.Graphics.FromImage(newImage);
                //设置质量                 
                newG.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
                newG.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;                   //置背景色        
                newG.Clear(Color.White);                 //画图               
                newG.DrawImage(initImage, new System.Drawing.Rectangle(0, 0, newImage.Width, newImage.Height), new System.Drawing.Rectangle(0, 0, initImage.Width, initImage.Height), System.Drawing.GraphicsUnit.Pixel);                   //文字水印     
                if (watermarkText != "")
                {
                    using (System.Drawing.Graphics gWater = System.Drawing.Graphics.FromImage(newImage))
                    {
                        System.Drawing.Font fontWater = new Font("宋体", 10);
                        System.Drawing.Brush brushWater = new SolidBrush(Color.White);
                        gWater.DrawString(watermarkText, fontWater, brushWater, 10, 10);
                        gWater.Dispose();
                    }
                }
                //透明图片水印    
                if (watermarkImage != "")
                {
                    if (File.Exists(watermarkImage))
                    {                         //获取水印图片   
                        using (System.Drawing.Image wrImage = System.Drawing.Image.FromFile(watermarkImage))
                        {                             //水印绘制条件：原始图片宽高均大于或等于水印图片                
                            if (newImage.Width >= wrImage.Width && newImage.Height >= wrImage.Height)
                            {
                                Graphics gWater = Graphics.FromImage(newImage);
                                //透明属性                       
                                ImageAttributes imgAttributes = new ImageAttributes();
                                ColorMap colorMap = new ColorMap();
                                colorMap.OldColor = Color.FromArgb(255, 0, 255, 0);
                                colorMap.NewColor = Color.FromArgb(0, 0, 0, 0);
                                ColorMap[] remapTable = { colorMap };
                                imgAttributes.SetRemapTable(remapTable, ColorAdjustType.Bitmap);
                                float[][] colorMatrixElements = {                    
                                                                    new float[] {1.0f,  0.0f,  0.0f,  0.0f, 0.0f},    
                                                                    new float[] {0.0f,  1.0f,  0.0f,  0.0f, 0.0f}, 
                                                                    new float[] {0.0f,  0.0f,  1.0f,  0.0f, 0.0f},      
                                                                    new float[] {0.0f,  0.0f,  0.0f,  0.5f, 0.0f},//透明度:0.5 
                                                                    new float[] {0.0f,  0.0f,  0.0f,  0.0f, 1.0f}   
                                                                };
                                ColorMatrix wmColorMatrix = new ColorMatrix(colorMatrixElements);
                                imgAttributes.SetColorMatrix(wmColorMatrix, ColorMatrixFlag.Default, ColorAdjustType.Bitmap);
                                gWater.DrawImage(wrImage, new Rectangle(newImage.Width - wrImage.Width, newImage.Height - wrImage.Height, wrImage.Width, wrImage.Height), 0, 0, wrImage.Width, wrImage.Height, GraphicsUnit.Pixel, imgAttributes);
                                gWater.Dispose();
                            }
                            wrImage.Dispose();
                        }
                    }
                }                   //保存缩略图        
                newImage.Save(savePath, System.Drawing.Imaging.ImageFormat.Jpeg);
                //释放资源               
                newG.Dispose();
                newImage.Dispose();
                initImage.Dispose();
            }
        }



        ///<summary>     
        /// 图片等比缩放         
        ///</summary>         
        /// <remarks>吴剑 2011-01-21</remarks>         
        /// <param name="postedFile">原图HttpPostedFile对象</param>      
        /// <param name="savePath">缩略图存放地址</param>         
        /// <param name="targetWidth">指定的最大宽度</param>         
        /// <param name="targetHeight">指定的最大高度</param>         
        /// <param name="watermarkText">水印文字(为""表示不使用水印)</param>         
        /// <param name="watermarkImage">水印图片路径(为""表示不使用水印)</param>        
        public static string ZoomAuto(System.IO.Stream fromFile, string savePath, System.Double targetWidth, System.Double targetHeight, string watermarkText, string watermarkImage, int quality)
        {
            string result = string.Empty;
            //创建目录       
            string dir = Path.GetDirectoryName(savePath);
            if (!Directory.Exists(dir))
                Directory.CreateDirectory(dir);
            //   savePath = Utils.PathCombine(dir, savePath.Substring(0, savePath.LastIndexOf('\\') + 1) + ".jpg");
            //原始图片（获取原始图片创建对象，并使用流中嵌入的颜色管理信息）  
            System.Drawing.Image initImage = System.Drawing.Image.FromStream(fromFile, true);
            ////缩略图宽、高计算                 
            //double newWidth = initImage.Width;
            //double newHeight = initImage.Height;
            ////宽大于高或宽等于高（横图或正方）               
            //if (initImage.Width > initImage.Height || initImage.Width == initImage.Height)
            //{
            //    //如果宽大于模版                 
            //    if (initImage.Width > targetWidth)
            //    {
            //        //宽按模版，高按比例缩放                    
            //        newWidth = targetWidth;
            //        newHeight = initImage.Height * (targetWidth / initImage.Width);
            //    }
            //}                 //高大于宽（竖图）       
            //else
            //{
            //    //如果高大于模版                   
            //    if (initImage.Height > targetHeight)
            //    {                         //高按模版，宽按比例缩放                    
            //        newHeight = targetHeight;
            //        newWidth = initImage.Width * (targetHeight / initImage.Height);
            //    }
            //}
            //生成新图              
            //新建一个bmp图片           
            using (System.Drawing.Image newImage = new System.Drawing.Bitmap((int)targetWidth, (int)targetHeight))
            {
                //新建一个画板                 
                System.Drawing.Graphics newG = System.Drawing.Graphics.FromImage(newImage);
                //设置质量                 
                newG.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
                newG.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;                   //置背景色        
                //newG.Clear(Color.White);                 //画图               
                newG.DrawImage(initImage, new System.Drawing.Rectangle(0, 0, newImage.Width, newImage.Height), new System.Drawing.Rectangle(0, 0, initImage.Width, initImage.Height), System.Drawing.GraphicsUnit.Pixel);                   //文字水印     
                if (watermarkText != "")
                {
                    using (System.Drawing.Graphics gWater = System.Drawing.Graphics.FromImage(newImage))
                    {
                        System.Drawing.Font fontWater = new Font("宋体", 10);
                        System.Drawing.Brush brushWater = new SolidBrush(Color.White);
                        gWater.DrawString(watermarkText, fontWater, brushWater, 10, 10);
                        gWater.Dispose();
                    }
                }

                //获取系统编码类型数组,包含了jpeg,bmp,png,gif,tiff      
                ImageCodecInfo[] icis = ImageCodecInfo.GetImageEncoders();
                ImageCodecInfo ici = null;
                foreach (ImageCodecInfo i in icis)
                {
                    if (i.MimeType == "image/jpeg" || i.MimeType == "image/bmp" || i.MimeType == "image/png" || i.MimeType == "image/gif")
                    {
                        ici = i;
                    }
                }
                EncoderParameters ep = new EncoderParameters(1);
                ep.Param[0] = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, (long)quality);

                string newPath = Utils.PathCombine(dir, Guid.NewGuid().ToString());
                //如果图片格式不正确则返回空字符串，否则返回Http相对路径
                if (initImage.RawFormat.Guid == System.Drawing.Imaging.ImageFormat.Jpeg.Guid)
                {
                    newPath += ".jpg";
                }
                else if (initImage.RawFormat.Guid == System.Drawing.Imaging.ImageFormat.Png.Guid)
                {
                    newPath += ".png";
                }
                else if (initImage.RawFormat.Guid == System.Drawing.Imaging.ImageFormat.Gif.Guid)
                {
                    newPath += ".gif";
                }
                else
                {
                    newPath += ".jpg";
                }

                //保存缩略图        
                try
                {
                    //newImage.Save(newPath, ici, ep);
                    newImage.Save(newPath);
                    result = newPath;
                }
                catch (Exception ex)
                {
                    throw ex;
                }
                ep.Dispose();
                //释放资源               
                newG.Dispose();

            }
            initImage.Dispose();
            return result;
        }

        #endregion
        #region 其它
        /// <summary>    
        /// 判断文件类型是否为WEB格式图片         
        /// (注：JPG,GIF,BMP,PNG)         
        /// </summary>         
        /// <param name="contentType">HttpPostedFile.ContentType</param>         
        /// <returns></returns>      
        public static bool IsWebImage(string contentType)
        {
            if (contentType == "image/pjpeg" || contentType == "image/jpeg" || contentType == "image/gif" || contentType == "image/bmp" || contentType == "image/png") { return true; } else { return false; }
        }
        /// <summary>
        /// 上传图片:本地
        /// </summary>
        /// <param name="strFullPath">原图存放地址</param>
        /// <param name="pathAppName">上传目标文件夹名称</param>
        /// <param name="strfilePath">上传目标路径</param>
        /// <param name="intWidth">图片宽度</param>
        /// <param name="intHeight">图片高度</param>
        /// <param name="error">出错信息</param>
        /// <returns>上传返回图片url地址</returns>
        /// <remarks></remarks>
        public static string UploadImg(System.IO.Stream fromFile, string pathUrl)
        {
            //从文件获取原始图片，并使用流中嵌入的颜色管理信息             
            System.Drawing.Image initImage = System.Drawing.Image.FromStream(fromFile, true);
            string strfilePath = string.Empty;
            try
            {
                string fileName = Utils.GetRandomFileName() + ".jpg";
                if (!string.IsNullOrEmpty(pathUrl))
                    strfilePath = Utils.PathCombine(pathUrl, fileName);

           //     string filePath = WebRequest.ServerMap(strfilePath);
                string filePath = Utils.GetMapPath(strfilePath);
                string path = Path.GetDirectoryName(filePath);
                if (!Directory.Exists(path))
                    Directory.CreateDirectory(path);
                initImage.Save(strfilePath, System.Drawing.Imaging.ImageFormat.Jpeg);
                initImage.Dispose();

                return filePath;
            }
            catch
            {
                return "";
            }
        }
        #endregion

        /// <summary>
        /// 图片转换成字节流
        /// </summary>
        /// <param name="img">要转换的Image对象</param>
        /// <returns>转换后返回的字节流</returns>
        public static byte[] ImgToByt(System.Drawing.Image img)
        {
            MemoryStream ms = new MemoryStream();
            byte[] imagedata = null;
            img.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
            imagedata = ms.GetBuffer();
            return imagedata;
        }


    }
}
